import axios from 'axios'
import Vue from 'vue'
import router from '@/router'
import util from '@/utils/parse.js'

// axios.create() 指定请求的基础url信息  http://www.axios-js.com/zh-cn/docs/

const http = axios.create({ 
    baseURL: 'http://localhost:8081'
})

// 请求拦截器, config是当前请求的所有的请求信息
http.interceptors.request.use(config => {
    let accessToken = Vue.$cookies.get('access_token')
    if(accessToken && accessToken.trim()) {
        config.headers['Authorization'] = `Bearer ${accessToken}`
    }
    return config;
}, err => Promise.reject(err))

/**
 * response => {} 表示一切正常，response是服务器端返回的数据
 */
http.interceptors.response.use(response => {
    return response;
}, err => {
    let status = err.response.status // 获取错误的状态码
    if(status === 401) {
        Vue.$cookies.remove('access_token')
        Vue.$cookies.remove('refresh_token')
        Vue.$cookies.remove('username')
        router.push('/login')
    }else if(status === 567) {
        // 要到服务器端换取新的token
        // 表示当前这个错误请求的所有的请求信息，获取他的作用就是当我们换了新的 access_token
        // 将该该请求在发一遍
        let preRequest = err.config  // 刚刚失败的那次请求

        let refreshToken = Vue.$cookies.get('refresh_token')
        if(refreshToken && refreshToken.trim()) {
            // 判断access_token有没有过期，因为可能是上一个请求交换回来的新的token
            let at = Vue.$cookies.get('access_token')
            if(at && at.trim()) {
                try {
                    let payload = util.parseJwtClaim(at);   // 获取jwt的中间部分
                    let exp = payload.exp  // 过期时间, 是从1970-01-01 到现在的秒数
                    
                    // new Date().getTime() 是从1970-01-01 到现在的秒数的毫秒数
                    let currentTime = Math.floor(new Date().getTime() / 1000)   // 获取当前的时间

                    console.log(`exp: ${exp}, currentTime: ${currentTime}`);

                    if(exp - currentTime > 0) {  //  没有过期
                        http(preRequest)
                    } else {
                        http.post('/auth/refresh/token', {refreshToken})
                        .then(res => {  // 拿到了新的token
                            let newAccessToken = res.data.data
                            // 重新设置到 cookie中
                            Vue.$cookies.set('access_token', newAccessToken)
                            http(preRequest)  // 将之前的请求再发送一次
                        })
                    }
                }catch(err) {
                    Vue.$cookies.remove('access_token')
                    Vue.$cookies.remove('refresh_token')
                    Vue.$cookies.remove('username')
                    router.push('/login')
                }
            }else {
                Vue.$cookies.remove('access_token')
                Vue.$cookies.remove('refresh_token')
                Vue.$cookies.remove('username')
                router.push('/login')
            }
            // if(at) {  // 如果access_token 是有效期范围内的
            //     http(preRequest)  // 将之前的请求再发送一次
            // }else {
                
            // }
        }else {  // 有可能没有了
            Vue.$cookies.remove('access_token')
            Vue.$cookies.remove('refresh_token')
            Vue.$cookies.remove('username')
            router.push('/login')
        }
    }
})

export default http

/**
 * axios  fetch  => OPTIONS 
 * 
 */